/*  
  -- The Lime II Project -- 

  A tuplespaces-based middleware for coordinating agents and mobile hosts.
  Copyright (C) 2005.
  Gian Pietro Picco, Amy L. Murphy, Lorenzo Bellini.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.

  You should have received this copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
*/

package lime2;

/**
 * The listener within a local reaction installed by the Lime system because of an in or rd towards the local 
 * projection of the tuplespace.
 * 
 * @author Gian Pietro Picco
 * @author Amy Murphy
 * @author Lorenzo Bellini
 */

class SystemLocalBlocking extends SystemListener
{
 // private data members	
 private LimeTSMgr ltsm; 
 private TupleOp op; 
  
 /**
  * Constructor method.
  * 
  * @param ltsm the LimeTSMgr of this tuplespace
  * @param op the TupleOp that required the installation of the system reaction 
  */ 
 SystemLocalBlocking(LimeTSMgr ltsm, TupleOp op)
 { 	
  this.ltsm = ltsm; 	
  this.op = op;
 } 
  
 /**
  * This method is invoked automatically by the Lime system when the corresponding reaction must fire. 
  * 
  * @param re ReactionEvent
  */ 
 public void reactsToOut(ReactionEvent re)
 {
  switch (op.type)
  {
   // IN	
   case (LimeConstants.IN):
        op.result.set(ltsm.doTake(re.getTuple())); // we can use "re" as a template since strong reactions are atomic
        op.result.lock.release();  
        break;    
   // RD
   case (LimeConstants.RD):
        op.result.set(re.getTuple()); 
        op.result.lock.release();
        break;                     	
  } 	
 }
 
}
